package com.example.big_event.controller;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.example.big_event.Utils.JwtUtil;
import com.example.big_event.Utils.Md5Util;
import com.example.big_event.Utils.Result;
import com.example.big_event.Utils.ThreadLocalUtil;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import com.example.big_event.pojo.entity.User;
import com.example.big_event.service.UserService;

import java.util.HashMap;
import java.util.Map;


@RestController
@RequestMapping("/user")
@Validated
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 用户注册功能
     * @param username 用户名
     * @param password 密码
     * @return 提示成功或者失败
     */
    @PostMapping("/register")
    public Result<User> register(String username,  String password){
        //查询用户
        User user = userService.findByUserName(username);

        if(user == null){
            // 没有占用，开始注册
            userService.register(username,password);
            return Result.success();
        }
        else
            // 被占用
            return Result.error("用户名已被占用");
    }


     /**
     *  登录功能
     * @param username 用户名
     * @param password 密码
     * @return 提示成功或者失败
     */
    @GetMapping("/login")
    public Result<String> login(String username,  String password){
        // 根据用户名找到用户
        User user  = userService.findByUserName(username);
        if(user == null)
            return Result.error("未找到该用户~~~");

        else{
            // 判断密码
            if(Md5Util.Md5Encrypt(password).equals(user.getPassword())){
                // 登录成功
                Map<String,Object> claims = new HashMap<>();
                claims.put("id",user.getId());
                claims.put("username",user.getUsername());
                String token = JwtUtil.getToken(claims);
                return Result.success(token);
            }
            return Result.error("密码错误");

        }
    }


    /**
     * 用来测试
     * @return 成功就返回"aa"
     */
    @PostMapping("/aa")
    public String aa(){
        System.out.println("aa");
        return "aa";
    }

    /**
     * 说白了就是将用户信息作为通关令牌存在token中，
     * 要用的时候会取出来解析，如果解析失败说明token令牌不对
     * 用来获取用户信息
     * @return 成功：返回从Authorization参数获取对应的用户信息
     */
    @GetMapping("/userInfo")
    public Result<User> userInfo( ) {
        // 根据用户名查用户
        // 从线程中把数据取出来
        Map<String,Object> map = ThreadLocalUtil.get();
        String username = (String) map.get("username");
        User user = userService.findByUserName(username);
        return Result.success(user);
    }


    /**
     * 用户更新功能
     * @param user 请求体中以json格式传入一个user
     * @return 成功或者失败的结果类型响应回去
     */
    @PostMapping("/update")
    public Result<User> userUpdate( @RequestBody @Valid User user){
        userService.updateById(user);
        return Result.success();
    }


    /**
     * 更新密码
     * @param password 更新后的密码
     * @return 成功或者失败的结果类型响应回去
     */
    @PatchMapping("/updatePassword")
    public Result<User> updatePwd(@RequestParam String password){
        // 从线程中获取id
        Map<String,Object> map =  ThreadLocalUtil.get();
        Integer id = (Integer) map.get("id");

        // 将密码进行md5加密
        password = Md5Util.Md5Encrypt(password);

        // 对字段进行设置更新，相当与数据库操作
        LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(User::getId,id).set(User::getPassword,password);
        // 同步到数据库
        boolean isUpdated = userService.update(updateWrapper);

        return isUpdated? Result.success():Result.error("更新失败");
    }

}